
    <html lang="zh-cn">
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <link href="F:\v_awjliu\BKDocs\ZH/default.css" rel="stylesheet">
    </head>
    <body>
    <h1 id="_1">产品简介</h1>
<p>标准运维是通过可视化的图形界面进行任务流程编排和执行的系统，是腾讯蓝鲸产品体系中一款轻量级的调度编排类 SaaS 产品。</p>
<p>标准运维有三大核心服务：
- 调度编排服务：基于蓝鲸 PaaS 平台服务总线（ESB）对接企业内部各个系统 API 的能力，将企业内部多系统间的工作整合到一个流程模版中，实现一键自动化调度。</p>
<ul>
<li>
<p>自助化服务：标准运维通过与蓝鲸 PaaS 平台深度整合，为用户提供了 “轻应用” 和 “职能化” 功能，让用户可以将业务日常的运维工作交给产品和职能化人员执行，实现业务的发布、变更等工作自助化。</p>
</li>
<li>
<p>标准插件自主开发：标准插件提供一套完整的开发流程规范，通过丰富的表单界面和验证逻辑将企业内部各个系统、各个平台的 API 组装成一个标准插件模板。使其他的系统通过标准插件的开发模板来调动不同系统间的功能。</p>
</li>
</ul>
<p>现在，蓝鲸标准运维已正式对外开源，GitHub 地址： <a href="https://github.com/Tencent/bk-sops">https://github.com/Tencent/bk-sops</a></p><h1 id="_1">术语解释</h1>
<ul>
<li>
<p><strong>组件</strong>：在蓝鲸体系里，我们将每一个对接到 ESB（企业服务总线）中的第三方接口称之为组件。</p>
</li>
<li>
<p><strong>标准插件</strong>：标准运维会根据每个 ESB 组件的业务逻辑进行二次封装，增加丰富的表单界面和验证逻辑，我们将这些称之为标准插件。它可以是一个作业平台的脚本作业，可以是腾讯云某个服务的一次接口调用，也可以是一个定时器等等。</p>
</li>
<li>
<p><strong>节点</strong>：标准运维中的一个流程单元，包括流程控制节点和任务节点。在执行任务时，每一个节点都会有未执行、正在执行、执行成功、执行失败的状态。</p>
</li>
<li>
<p><strong>流程控制节点</strong>：标准运维中的一类节点，本身不包含具体执行逻辑，只是用来控制任务流程的执行过程。如开始节点标识任务流程的开始，网关节点控制并行流程和分支流程的开始、结束。</p>
</li>
<li>
<p><strong>网关节点</strong>：包括并行网关、分支网关和汇聚网关，用来控制并行和分支流程的开始、结束。</p>
</li>
<li>
<p><strong>并行网关</strong>：用来标识并行流程的开始，通过和汇聚网关配对使用，可以控制多个节点并行执行。</p>
</li>
<li>
<p><strong>分支网关</strong>：用来标识分支流程的开始，通过和汇聚网关配对使用，可以根据分支表达式的计算结果，动态的控制多个分支中某一个分支执行。</p>
</li>
<li>
<p><strong>汇聚网关</strong>：用来标识并行流程或者分支流程的结束，请注意，标准运维中并行流程中可以嵌入分支流程，分支流程中也可以再嵌入并行流程，请务必保证汇聚网关和并行网关或分支网关一一对应，而不能出现交叉嵌入或者不配对的情况。</p>
</li>
<li>
<p><strong>任务节点</strong>：任务节点是标准运维的具体执行逻辑单元，包括标准插件节点和子流程节点，每个任务节点包括基础信息、输入参数和输出参数，其中输入参数和输出参数可以用来勾选生成全局变量，输入参数还可以引用全局变量来简化用户输入。</p>
</li>
<li>
<p><strong>标准插件节点</strong>：标准运维中的最小执行单元，需要引用标准运维提供的标准插件，表示通过流程模板创建任务时，会执行一次选择的标准插件。</p>
</li>
<li>
<p><strong>子流程节点</strong>：通过子流程节点，用户可以实现流程模板的复用。一般情况下，用户可以新建多个流程模板，每个流程模板功能比较简单，然后在新建的流程模板中，引用之前创建的简单流程模板作为子流程，组成一个复杂逻辑的新流程模板。</p>
</li>
<li>
<p><strong>顺序流</strong>：顺序流是标准运维中用来连接两个节点的有向线段，标识任务流程的执行方向。</p>
</li>
<li>
<p><strong>流程/流程模板</strong>：在标准运维里，每一个基础运维场景的操作指引就是一个流程，流程是创建任务的模板。</p>
</li>
<li>
<p><strong>任务/任务实例</strong>：在标准运维里，我们可以根据一个流程创建出一个任务，每个任务都是一次真正的业务场景作业，任务可以被暂停、被强制终止。</p>
</li>
<li>
<p><strong>全局变量</strong>：全局变量是一个流程模板的公共参数，通过 KEY 来做唯一性约束。用户可以在任务节点的输入参数和分支网关表达式中引用，标准运维会在执行任务时自动替换全局变量的引用为全局变量的值。</p>
</li>
<li>
<p><strong>轻应用</strong>：为了做更精细的权限控制，我们增加了轻应用，你可以通过一个流程模板创建出一个轻应用，并授权给相关人员去执行，轻应用将自动出现在相关人员的蓝鲸工作台（企业版则出现在蓝鲸桌面）上，由于标准运维的任务界面足够简约，所以即便这个人不懂技术也可以执行任务。</p>
</li>
</ul><h1 id="_1">产品架构图</h1>
<p>标准运维后台使用 Python 作为开发语言，使用 Django 开发框架；前端使用 Vue 开发页面，使用 jQuery 开发原子，通过配置式的开发模式，不断降低用户开发原子前端表单的难度。</p>
<p>标准运维的产品结构如图所示：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/1.png" /></p>
<ul>
<li>
<p>接入层：包含权限控制、API 接口和数据统计等；</p>
</li>
<li>
<p>任务管理层：主要对应标准运维的任务编排和任务控制功能，任务编排包含基础单元标准插件框架和标准插件展示层，任务控制包括创建任务实例的模板校验和参数校验，以及任务实例执行时给用户提供的操作接口如暂停、继续、撤销任务等；</p>
</li>
<li>
<p>流程引擎层：负责解析上层的任务实例，映射节点标准插件对应的服务，并通过底层的蓝鲸服务总线（ESB）调用其他系统的 API（如配置平台的创建集群，作业平台的快速执行脚本等），流程引擎层还包括了具体的任务执行引擎和流程控制、上下文管理等模块。</p>
</li>
</ul><h2 id="job">JOB 任务流程</h2>
<p>在这个章节中，你能够根据指引编排一个调度 JOB 作业的流程，这个流程会在第一个节点中到 JOB 中执行一段脚本，随后根据这段脚本的执行结果再去决定后续的工作。</p>
<h3 id="_1">新建流程</h3>
<p>进入某个项目的项目流程页面下，点击“新建按钮”</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_new_flow.png" /></p>
<h3 id="_2">编排流程</h3>
<p>在这个流程中我们需要使用到一个分支网关，一个并行网关，和四个任务节点，先按照下图所示配置出整体的流程框架：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_flow_framework.png" /></p>
<p>在编排流程的过程中我们可以通过单机节点弹出的快捷面板来快速在该节点后生成其他节点：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_node_panel.png" /></p>
<h3 id="_3">配置第一个节点</h3>
<p>让我们先来配置流程中的第一个节点，双击节点打开配置面板，选择“作业平台(JOB)-快速执行脚本”插件：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_first_node_config.png" /></p>
<p>进行如下配置</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_first_node_input.png" /></p>
<p>这里我们重点讲一下这几点：
- 在脚本内容中我们执行了一段 <code>echo "&lt;SOPS_VAR&gt;my_output:${flag}&lt;/SOPS_VAR&gt;"</code> 脚本，这里使用了两个特殊语法：
  - <code>&lt;SOPS_VAR&gt;key:value&lt;/SOPS_VAR&gt;</code>：在标准运维的任意步骤中，通过 JOB 插件（快速执行脚本、执行作业），输出<code>&lt;SOPS_VAR&gt;key:val&lt;/SOPS_VAR&gt;</code>格式的字符串，即将变量 key 赋值 val，并添加到节点输出中
  - <code>${flag}</code>：这里是表示对标准运维流程全局变量中 <code>${flag}</code> 变量的引用，如果全局变量存在的话，标准运维会在执行任务时替换为变量实际的值
- 在脚本的目标 IP 中我们引用了 <code>${ip}</code> 变量，而不是将 IP 写死在配置中</p>
<p>看完输入参数配置，我们再来看看输出参数：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_first_node_output.png" /></p>
<p>这里我们将“JOB 全局变量”这个输出参数勾选到了流程全局变量中，这样我们可以在后面的流程中使用</p>
<h3 id="_4">配置第二个节点</h3>
<p>下面来配置第二个节点，打开节点配置，依旧选择“作业平台(JOB)-快速执行脚本”插件，并进行如下配置</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_second_node_config.png" /></p>
<h3 id="_5">配置分支网关</h3>
<p>分支网关能够引用流程上下文中的变量，并根据用户配置的表达式来决定要执行哪个分支，点击第一个分支条件打开配置面板并进行如下配置：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_branch_1.png" /></p>
<p>我们通过表达式 <code>"${log_outputs['my_output']}" == "1"</code> 引用了第一个节点中输出的 my_output 变量的值，并通过表达式进行判断，如果其值为 <code>"1"</code>，流程就会执行这条分支。</p>
<p>下面我们按照同样的步骤配置另一条分支：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_branch_2.png" /></p>
<h3 id="_6">配置全局变量</h3>
<p>最后一步我们要完成全局变量的配置，我们要配置两个全局变量：</p>
<ul>
<li><code>${flag}</code>：第一个节点的脚本内容中引用的变量，控制第一个节点的输出内容</li>
<li><code>${ip}</code>：执行流程中两个节点所配置的脚本的机器 IP</li>
</ul>
<p>打开全局变量面板：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_constants_icon.png" /></p>
<p>参考下图先完成 <code>${flag}</code> 的配置：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_constant_flag.png" /></p>
<p>再参考下图完成 <code>${ip}</code> 的配置：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_constant_ip.png" /></p>
<p>完成配置后你的全局变量中应该有这些变量：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_all_constants.png" /></p>
<p>最后保存流程，并使用该流程新建一个任务</p>
<h3 id="_7">参数填写</h3>
<p>使用流程新建任务时，在参数填写界面按照下图进行填写和配置</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_fill_params.png" /></p>
<p>这里我们先将“JOB 输出”设置为<code>1</code>，“脚本执行 IP” 选择当前业务下的任意 IP 即可。</p>
<h3 id="_8">任务执行</h3>
<p>完成参数填写和任务创建后，我们会进入到任务详情页面。点击“查看参数”按钮能够预览每个节点的执行参数：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_view_params.png" /></p>
<p>如果配置正确的话，可以看到引用参数的地方都已经被替换掉了：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_view_params_detail.png" /></p>
<p>点击执行按钮开始任务执行：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_start.png" /></p>
<p>可以看到，任务按照我们的配置执行了 “flag = 1” 分支：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_exec_flag_1.png" /></p>
<p>点击任务节点能够看到节点执行详情：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_node_exec_detail.png" /></p>
<h3 id="flag">修改 flag</h3>
<p>创建一个新的任务，这次我们将 flag 的值填写为 <code>0</code> 并执行任务，可以看到，任务走向了另一条分支：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/job_flow_exec_flag_0.png" /></p><h1 id="_1">产品功能</h1>
<p>标准运维是一套通过成熟稳定的任务调度引擎，把多系统间的工作整合到一个流程，助力运维实现跨系统调度自动化的 SaaS 应用。标准运维拥有可视化的图形界面，用户可通过它实现任务流程编排和执行，包括发布、变更、开区、扩缩容等执行类操作场景。</p>
<h2 id="_2">标准运维</h2>
<table>
<thead>
<tr>
<th>功能</th>
<th>功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>项目流程</td>
<td>项目流程是标准运维的核心功能。业务流程页面展示了当前业务下的流程列表，支持高级搜索、新建流程、新建任务、编辑流程、预览流程、克隆流程、权限管理、查看执行历史、删除等操作。</td>
</tr>
<tr>
<td>任务管理</td>
<td>满足用户追溯之前的任务执行情况和周期任务的配置。</td>
</tr>
<tr>
<td>轻应用</td>
<td>用户可以根据一个已执行完成的任务创建一个轻应用到指定用户的蓝鲸工作台（企业版则出现在蓝鲸桌面）。</td>
</tr>
<tr>
<td>公共流程</td>
<td>公共流程页面展示了所有业务下都能够使用的公共流程列表，包含了高级搜索、新建任务、权限管理、查看执行历史等操作。</td>
</tr>
<tr>
<td>职能化</td>
<td>职能化用户在此可以完成一系列职能化操作。</td>
</tr>
<tr>
<td>审计中心</td>
<td>在此可以审计执行过的所有任务历史。</td>
</tr>
<tr>
<td>项目管理</td>
<td>在这里可以查看和管理有权限的项目。</td>
</tr>
<tr>
<td>管理员入口-搜索</td>
<td>根据项目名，模板 ID 或是任务 ID 对项目，流程模板或是任务进行搜索操作。</td>
</tr>
<tr>
<td>周期任务</td>
<td>在这里可以看到整个系统中所有的周期任务。</td>
</tr>
<tr>
<td>远程插件包源管理</td>
<td>管理系统中配置的远程插件源和本地缓存。</td>
</tr>
<tr>
<td>远程插件同步</td>
<td>将远程插件代码同步到本地缓存中。</td>
</tr>
</tbody>
</table><h1 id="_1">首页</h1>
<p>标准运维在蓝鲸体系上体现为一个工具 SaaS。首页界面如下所示：是一个全局视图，包含 “常用项目”、“我的收藏” 和 “我的动态”。</p>
<ul>
<li>
<p>常用项目：根据使用频率将经常使用的项目罗列展示出来。</p>
</li>
<li>
<p>我的收藏：展示用户对流程模板，公共流程，周期任务和轻应用的收藏列表。</p>
</li>
<li>
<p>我的动态：展示最近执行的十条任务。</p>
</li>
</ul>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/标准运维首页.png" /></p><h2 id="_1">项目流程</h2>
<p>业务流程是标准运维的核心功能。</p>
<p>业务流程页面展示了当前业务下的流程列表，支持高级搜索、新建流程、新建任务、编辑流程、预览流程、克隆流程、权限管理、查看执行历史、删除等操作。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/业务流程.png" /></p>
<p><strong>可视化任务流程配置</strong>。新建流程时，用户可以通过图形界面进行任务流程编排。在编排页面，用户可以通过左侧的工具栏来添加节点，流程节点包含流程控制节点和任务节点。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/可视化流程.png" /></p>
<p>1、流程控制节点包括：
- 开始节点——标识流程的开始
- 结束节点——标识流程的结束
- 并行网关——标识并行执行的开始
- 分支网关——标识分支执行的开始（每个分支都需要设置分支表达式，执行时只有一条表达式为 True 的分支会被执行）
- 汇聚网关——标识并行或分支的结束</p>
<p>2、任务节点包括标准插件节点和子流程节点。
- 标准插件节点是标准运维内置的最小执行单元，一般对应于蓝鲸服务总线（ESB）的一次接口调用或者标准运维内置服务，如：定时
- 子流程节点可以选择用户已经创建的流程模板，在新的流程中引用并作为子流程执行</p>
<p>点击某一个任务节点时，会弹出该节点的参数和配置，不同类型的标准插件参数各不相同，但都可以勾选到全局变量区或者引用全局变量。</p>
<p>每个任务节点可以设置 “失败处理” 和 “是否可选” 属性，勾选了 “是否可选” 的节点在执行任务前的 “节点选择” 阶段可以选择本次任务是否执行该节点；勾选了 “自动忽略” 的节点在执行时不论是否成功都不会中断任务流程，而是继续执行后续的节点。</p><h1 id="_1">新建流程</h1>
<p>具体步骤：</p>
<p><strong>新建流程 - 流程名称 - 流程节点 - 全局变量</strong></p>
<p>1、新建流程</p>
<p>用户可以通过对标准插件节点、子流程节点与网关节点的组合，变量的配置与引用，配置出一个业务流程。</p>
<p>流程名称是用户用来描述流程模板的，默认值是 <code>new时间格式串</code>，用户可以自行修改，注意不能包含空格、括号等特殊字符。</p>
<p>用户可以从左边的工具栏，拖拽合适的节点到画布中，并通过连线，组成合法的流程模板。</p>
<p><strong>注意：</strong> 流程名称不能包含'‘"”$&amp;&lt;&gt;非法字符。</p>
<p>2、工具栏说明</p>
<p>工具栏中流程节点包含流程控制节点和任务节点。流程控制节点包括：</p>
<ul>
<li>开始节点——标识流程的开始</li>
<li>结束节点——标识流程的结束</li>
</ul>
<p>一个合法的流程模板只能有一个开始节点和结束节点，开始节点出度（箭头指向节点的连线数量）只能为 1，入度（箭头背离节点的连线数量）为 0。结束节点入度为 1，出度为 0。</p>
<p>流程控制节点还包括：</p>
<ul>
<li>并行网关——标识并行执行的开始</li>
<li>分支网关——标识分支执行的开始</li>
<li>汇聚网关——标识并行或分支的结束</li>
</ul>
<blockquote>
<p>请注意，每一个并行网关或者分支网关都需要配置一个汇聚网关来标识并行或分支流程的结束。</p>
</blockquote>
<p>并行网关入度为 1，出度不小于 2。并行网关出度上的多个节点在执行时会并发执行，对应的汇聚网关在等待所有并行流程执行完成后才会开始启动后续的流程节点。</p>
<p><img alt="g2" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/g2.png" /></p>
<p>分支网关和并行网关类似，区别在于分支网关出度上的多个节点在执行时会根据分支条件启动分支表达式为 True 的一个分支流程，其他的分支则不会被执行。启动的分支执行完成后就立刻启动对应的汇聚网关，接着执行后续的流程节点。分支表达式的语法请参考 <a href="../附录/grammar.md">附录 1</a> 说明。</p>
<p><img alt="g3" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/g3.png" /></p>
<p>任务节点包括标准插件节点和子流程节点。标准插件节点是标准运维内置的最小执行单元，一般对应于蓝鲸服务总线（ESB）的一次 API 调用或者标准运维内置服务如定时。</p>
<p>双击标准插件节点可以配置标准插件节点的参数。其中标准插件类型可以选择一个标准运维接入的标准插件，输入参数、输出参数和选择的标准插件对应，每个标准插件的参数一般不同，如“作业平台(JOB)-快速执行脚本”是对应作业平台的快速执行脚本 API，需要填写脚本类型、脚本内容、脚本参数、超时时间、目标 IP、目标账户等输入参数，在执行时，标准运维会把用户填写的前端参数转换为 ESB 需要的参数格式并调用 API，然后根据 API 返回结果把 JOB 任务 ID、JOB 任务链接、执行结果（成功或失败）作为输出参数展示在执行详情中，后续的流程节点也可以引用前面节点的输出参数。</p>
<p><img alt="发布6" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/发布6.png" /></p>
<p>子流程节点可以选择用户已经创建的流程模板，在新的流程中引用并作为子流程执行。子流程节点的输入参数是选择的流程模板中显示属性为 “显示” 的全局变量，也就是该子流程模板单独创建任务时需要填写的任务参数。输出变量是选择的流程模板中勾选了输出属性的全局变量。</p>
<p><img alt="g4" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/sops003.png" /></p>
<p>5、全局变量</p>
<p>全局变量是一个流程模板的公共参数，通过 KEY 来做唯一性约束。用户可以在任务节点的输入参数和分支网关表达式中引用，标准运维会在执行任务时自动替换全局变量的引用为全局变量的值。</p>
<p>全局变量的来源有三种：</p>
<p>一是 通过任务节点的输入参数勾选生成，这类全局变量的类型是 “组件”，并且不能更改；默认值和来源标准插件的输入参数的表单类型一致，如标准插件节点的参数是单选框，勾选生成的全局变量也是单选框。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/sops004.png" /></p>
<p>二是 通过任务节点的输出参数勾选生成，这类全局变量类型也是 “组件”，并且不能更改；无默认值属性，因为这类全局变量的值是由生成该变量的标准插件节点、子流程节点的输出结果自动生成的，用户无法手动设置；此外，这类全局变量的显示属性是 “隐藏”，并且不能更改，表示执行任务时不需要用户手动填写这类参数。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/sops005.png" /></p>
<p>三是 用户在全局变量区点击 “新增变量” 生成，手动添加的全局变量类型可以选择输入框、文本框、日期时间、整数、IP 选择器等，并且可以随时切换；这类变量可以自定义校验规则，这样在创建任务填写参数时，可以避免填写不合法的参数值。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/sops006.png" /></p>
<p>全局变量可以通过 <code>${key}</code> 的语法引用，并且全局变量的默认值中也可以引用其他的全局变量，只要保证无循环引用即可。多个任务节点的输入参数引用同一个全局变量，可以实现参数共享，减少创建任务时需要填写的参数；任务节点输入参数通过形如 <code>xxx${key}</code> 方式部分引用全局变量，可以实现简化输入参数的目的；任务节点输入参数或者分支条件表达式通过引用之前的任务节点的输出参数生成的全局变量，可以实现根据任务节点输出控制后面节点输入参数和分支流程走向。</p>
<p><img alt="g5" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/sops007.png" /></p><h1 id="_1">新建任务</h1>
<p>用户可以在 “流程模板” 页点击流程模板的 “新建任务” 按钮创建一个任务。</p>
<p>具体步骤：</p>
<p>选择任务节点 - 填写参数 - 预览 - 查看参数 - 启动任务</p>
<p>1、新建任务时，用户需要选择要执行的任务节点（也可以通过点击执行方案快速选择要执行的任务节点），并点击 “下一步”。注意，只有设置了可选节点属性为 “ON” 的任务节点，才能在节点选择阶段选择不执行，其他的任务节点必须执行。</p>
<p><img alt="新建任务1" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/新建任务1.png" /></p>
<p>节点选择时，可以开启 “预览模式”，查看不同方案下的任务模式。</p>
<p><img alt="新建任务2" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/新建任务2.png" /></p>
<p>2、启动任务之前，用户可以点击 “查看参数” 确认变量替换后生成的每个任务节点的参数，如果不符合预期，可以点击 <code>修改参数</code> 重新填写任务的全局变量参数，确认无误后，点击 “执行” 就可以立即启动当前任务流程实例了。</p>
<p><img alt="新建任务3" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/新建任务3.png" /></p>
<p>3、在任务执行过程中，用户可以暂停任务，继续任务或者终止任务，任务执行到某个标准插件失败后也可以选择 “跳过” 或者修改参数后 “重试”。</p>
<p><img alt="新建任务4" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/新建任务4.png" /></p><h1 id="_1">任务记录</h1>
<p><strong>任务历史可追溯</strong>。用户在任务记录页面，可以追溯之前的任务执行情况。</p>
<p><img alt="任务记录" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/任务记录.png" /></p>
<p>可对执行过的任务进行克隆，删除管理。同时，可展开 “高级搜索” 进行过滤查询。</p><h1 id="_1">周期任务</h1>
<p>周期任务能够满足用户对流程模板定期执行任务的需求。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/43.png" /></p>
<ul>
<li>新建周期任务</li>
</ul>
<p>用户可以在新建任务时通过参数填写的页面中执行计划选择周期执行任务来创建一个周期任务。填写周期表达式来确认任务触发执行的时间。周期表达式可以通过两种方式设置：选择生成，或者手动输入。</p>
<p><img alt="周期任务1" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/周期任务1.png" /></p>
<ul>
<li>周期表达式</li>
</ul>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/45.png" /></p>
<ul>
<li>生成周期任务</li>
</ul>
<p>新建成功后，周期任务会按照周期规则自动执行，在页面上能够对周期任务执行暂停、编辑、删除、执行任务操作。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/46.png" /></p>
<ul>
<li>编辑周期任务</li>
</ul>
<p>用户能够编辑周期任务来修改周期规则以及参数信息。注意：周期任务的状态为 “暂停” 时才可编辑。如果周期任务为 “启动” 中时，需将其暂停后再进行编辑操作。</p>
<ul>
<li>执行历史</li>
</ul>
<p>用户能够查看周期任务完整的执行历史，来查看任务执行情况。并可以对已执行的任务进行克隆、删除。</p><h1 id="_1">轻应用</h1>
<p><strong>零成本创建“轻应用”</strong>。业务运维人员将日常工作标准化后，以标准运维中一个模板的形式提供给业务非技术人员使用，为了降低使用者的操作风险和使用成本，将该模板以独立 SaaS 应用的方式指定给授权者使用，这种不需要开发、零成本快速生成的 SaaS 应用称为 “轻应用”。标准运维通过与蓝鲸集成平台深度结合，可以提高业务的自助化能力，便于业务非技术人员执行日常工作。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/sops002.png" /></p>
<p>在轻应用页面，用户可以根据一个已执行完成的任务创建一个轻应用到指定用户的蓝鲸工作台（若是企业版，则显示在蓝鲸桌面的 “应用市场”，用户可以自行添加到个人桌面）。</p>
<h2 id="_2">新建轻应用</h2>
<p>用户可以选择一个流程模板创建出一个轻应用，轻应用创建完成后，会直接展示在用户的蓝鲸工作台上（若是企业版，则显示在蓝鲸桌面的 “应用市场”，用户可以自行添加到个人桌面），对使用人员而言，轻应用只需要关注一个流程模板的参数填写和任务操作，由于页面足够的简洁和友好，一个非技术人员也可以通过轻应用执行任务，这也就是标准运维提供的自助化服务之一。</p>
<blockquote>
<p>注意，只有在权限中心申请了对应轻应用的“轻应用查看”和其对应模板的“流程查看”权限后才能访问轻应用，如果需要某个用户可以通过轻应用创建任务和执行任务，请提前在权限中心申请该轻应用的“轻应用查看”和“轻应用创建任务”权限以及轻应用对应模板的“流程查看”权限。</p>
</blockquote>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/26.png" /></p>
<h2 id="_3">编辑轻应用</h2>
<p>如果需要修改轻应用的名称、简介或者 Logo，请在轻应用列表中，通过鼠标选择需要修改的轻应用，点击编辑图标后，在弹窗中填写修改后的参数。</p>
<blockquote>
<p>注意，不能修改轻应用引用的流程模板，如果需要这样做，请删除旧轻应用后重新创建新的轻应用，并引用新的流程模板。</p>
</blockquote>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/27.png" /></p>
<h2 id="_4">删除轻应用</h2>
<p>如果需要删除轻应用，请在标准运维轻应用列表中，通过鼠标选择需要修改的轻应用，点击删除图标后，在弹窗中二次确认并删除，删除成功后会同步删除个人工作台（蓝鲸桌面）的轻应用。</p><h2 id="_1">公共流程</h2>
<p>公共流程通常用于管理在所有业务下都能够使用的一些流程。你可以在任意有权限的业务下使用公共流程新建任务。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/common_flow.png" /></p>
<p>在对应的流程上点击“新建任务”就能够选择特定的项目来创建和执行任务啦：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/common_flow_create_task.png" /></p>
<h3 id="_2">编辑公共流程</h3>
<p>在对公共流程进行配置和编排的时候，我们可能会遇到一些需要选择业务的节点，如作业平台(JOB)-快速执行脚本，而公共流程大多数情况下是不需要提前配置节点所属的业务的，这个时候我们只需要将“业务”字段勾选为全局变量即可，当我们在某个业务下使用该流程新建任务的时候，标准运维会自动为你填充该字段：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/common_flow_biz_select.png" /></p><h2 id="_1">职能化</h2>
<p>职能化中心能够让你把任务的执行转交给对应的职能化同事来操作，只要用户拥有“职能化中心查看”的权限，就能够进入职能化中心页面：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/asssets/../assets/function_task.png" /></p>
<h3 id="_2">如何创建职能化任务</h3>
<p>当我们使用流程创建任务时，在参数填写界面能够选择“流程类型”，将任务类型修改为“职能化任务流程”，在参数填写完成后该任务就会以“待认领”的状态进入到职能化中心中等待认领：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/asssets/../assets/function_task_create.png" /></p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/asssets/../assets/function_task_to_be_claim.png" /></p>
<p>当然，职能化人员也可以在职能化页面主动创建任务（需要拥有“流程查看”和“流程新建任务”权限）：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/asssets/../assets/function_task_create_task.png" /></p><h2 id="_1">审计中心</h2>
<p>审计中心提供了对系统内所有任务审计的总览视图，只要拥有“审计中心查看”权限就能够进入审计中心：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/asssets/../assets/audit.png" /></p><h2 id="_1">项目管理</h2>
<p>项目管理界面展示了目前你有查看权限的所有项目，你可以在项目管理页面对项目进行查看，编辑和停用操作：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/asssets/../assets/project_management.png" /></p><h1 id="_1">管理员入口</h1>
<h2 id="_2">后台管理</h2>
<p>包含远程插件包源管理，和远程插件同步。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/后台管理.png" /></p>
<p>后台管理可以让用户不修改标准运维源码就可以加载第三方插件，解决了标准插件开发和维护流程复杂的问题，让用户可以不需要解压官方包以及重新打包，只需要在自定义插件开发测试完成后，在标准运维配置自定义插件包源信息，然后重新部署应用，就能自动加载插件。</p>
<p>1.配置主包源信息。在配置页面，填入需要的信息</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/远程1.png" />
<img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/远程2.png" />
<img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/远程4.png" /></p>
<p>2.重新部署后成功加载插件效果 在 “新建流程” 中编辑默认的标准插件节点，可以看到远程插件包源中的 “自定义原子(CUS)-测试 1” ，并且选择该插件后页面渲染正常。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/远程5.png" /></p>
<h2 id="_3">运营数据</h2>
<p>包含流程统计、任务统计、标准插件统计、轻应用统计 4 个维度的运营数据分析。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/运营数据.png" /></p>
<h2 id="_4">公共流程</h2>
<p>公共流程是标准运维方便用户在不同业务中共用同一套流程模板的功能。用户可以新建公共流程，达到多业务共享公共流程模板的目的。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/49.png" /></p><h1 id="_1">常见问题</h1>
<p>1.标准运维标准插件支持用户接入企业内 IT 系统吗？</p>
<p>支持，接入方式请参考 <a href="../附录/Django.md">附录 2：标准插件开发</a>。</p>
<p>2.标准运维点击开始执行任务后报错：<code>taskflow[id=1] get status error: node(nodee37e20…c7fb131) does not exist, may have not by executed</code>，并且在任务列表中查看任务状态是 <code>未知</code>，可能是什么原因？</p>
<p>标准运维执行引擎依赖于蓝鲸的 RabbitMQ 服务和 App 启动的 Celery 进程，请登录服务器确认服务已启动并正常运行，可以查看 App 的 celery.log 日志文件帮助定位问题原因。</p>
<p>3.标准运维能执行任务，但是标准插件节点报错：<code>Trackback…TypeError:int() argument must be a string or a number,not ‘NoneType’</code>，可能是什么原因？</p>
<p>标准运维任务流程的执行状态和标准插件输入、输出等信息缓存依赖 Redis 服务，所以首次部署请务必按照 [标准运维部署文档]，配置 Redis 环境变量后重新部署。</p><h1 id="_1">定义</h1>
<p>分支表达式是一段符合 Python 语法的简单代码，是二元操作符和关键字组成的表达式。</p><h1 id="_1">语法</h1>
<p>二元操作符语法和使用示例参考下面的表格：</p>
<table>
<thead>
<tr>
<th>二元操作符</th>
<th>含义</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td>==</td>
<td>等于</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>!=</td>
<td>不等于</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>&gt;</td>
<td>大于</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>&lt;</td>
<td>小于</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>&gt;=</td>
<td>大于等于</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>&lt;=</td>
<td>小于等于</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>in</td>
<td>包含于</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>notin</td>
<td>不包含于</td>
<td v1="v1">$</td>
</tr>
</tbody>
</table>
<p>关键字语法和使用示例参考下面的表格</p>
<table>
<thead>
<tr>
<th>关键字</th>
<th>含义</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td>and</td>
<td>且</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>or</td>
<td>或</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>True<br>true</td>
<td>真</td>
<td v1="v1">$</td>
</tr>
<tr>
<td>False<br>false</td>
<td>假</td>
<td v1="v1">$</td>
</tr>
</tbody>
</table>
<p>分支表达式也可以通过 ${key} 方式引用全局变量，如：<code>${v1} == ‘1’</code>，<code>‘test’ in ${v1}</code>。</p><h1 id="_1">分支执行逻辑</h1>
<p>执行到分支网关节点时，标准运维执行引擎分别计算每个分支表达式的结果，得出为 True 或者 False。</p>
<p>如果有多个分支条件为 True，执行分支会根据判定顺序，执行第一个结果为 True 的分支，所以请不要设置多个分支的条件存在并集或者多个分支条件一样，如：</p>
<ul>
<li>分支 1： <code>${v1} &gt; 2</code></li>
<li>分支 2： <code>${v1} &gt; 1</code></li>
<li>分支 3： <code>${v1}  &lt;= 1</code></li>
</ul>
<p>可以改为
- 分支 1： <code>${v1} &gt; 2</code>
- 分支 2： <code>${v1} &gt; 1 and ${v1}  &lt;= 2</code>
- 分支 3： <code>${v1}  &lt;= 1</code></p>
<p>如果所有分支判定为 False，则分支网关执行报错。分支网关出错后需要人工介入，手动指定执行分支，选项是各分支的条件表达式，所以请不要设置多个分支的条件表达式一样，否则出错后无法区分需要执行的分支。</p><h1 id="django-app">创建 Django APP 和目录结构</h1>
<p>在根目录下执行 Django-admin startapp custom_atoms ，然后新建 components/collections 和 static/custom_atoms 目录。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/31.png" /></p><h1 id="settings">修改 settings 配置</h1>
<p>打开 conf/settings_custom.py 文件，找到 I NSTALL_APPS_CUSTOM，加入步骤 1）中创建的 custom_atoms。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/32.png" /></p><h1 id="esb-api">接入 ESB API</h1>
<p>如果需要调用自定义的 API，请在完成 ESB 接入后，更新标准运维 blueking/component 下的文件。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/33.png" /></p><h1 id="_1">标准插件后台开发</h1>
<p>在 custom_atoms/components/collections 目录下创建 test.py 文件，其中需要定义的属性和类如下所示。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/34.png" /></p>
<p>test.py 属性详解：
- <strong><strong>group_name</strong></strong> ：标准插件所属分类（一般是对应 API 的系统简称，如配置平台(CC)）
- class TestCustomService(Service)：标准插件后台执行逻辑
- <strong><strong>need_schedule</strong></strong> = True：是否是异步执行，默认为 False
- interval = StaticIntervalGenerator(5)：异步标准插件的轮询策略
- def execute：前端参数获取、API 参数组装、结果解析、结果输出
- def schedule：轮询逻辑、结果输出
- def outputs_format：输出参数格式化
- class TestCustomComponent(Component)：标准插件定义
- name： 标准插件名称
- code：唯一编码
- bound_service：绑定后台服务
- form：前端表单定义文件路径  </p>
<p>TestCustomService 中 execute 函数详解：
- 可以是任何 Python 代码，如果对应于 ESB API 调用，一般分为参数组装、API 调用、结果解析。
- data 是标准插件前端数据，对应于前端的表单，可以用 get_one_of_inputs 获取某一个参数；执行完成可以使用 set_outputs 写入返回值和异常信息(ex_data)。
- parent_data 是任务的公共参数，包括 excutor—执行者，operator—操作员，biz_cc_id—所属业务 ID。详细请查看 gcloud/taskflow3/utils.py。
- 返回 True 表示标准插件执行成功，False 表示执行失败。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/35.png" /></p>
<p>TestCustomService 中 execute 函数详解：
- 返回列表格式。
- 列表格式的每一项定义一个返回字段，是 execute 函数中的 set_outputs 输出的字段的子集；key—输出字段标识，name—输出字段含义，type—输出字段类型（str、int 等 Python 数据结构）。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/36.png" /></p>
<p>TestCustomService 中 shedule 函数详解：
- 由 interval 控制调用策略，如 pipeline.core.flow.activity.StaticIntervalGenerator（每隔多少秒轮询一次）、DefaultIntervalGenerator（每次轮询间隔时间是上一次的两倍）。
- 使用 self.finish_schedule 结束轮询。
- 返回 True 表示标准插件执行成功，False 表示执行失败。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/37.png" /></p><h1 id="_1">标准插件前端开发</h1>
<p>在 custom_atoms/static/custom_atoms 目录下创建 test 目录，并创建 test_custom.js 文件，注意文件路径和标准插件后台定义的 form 保持一致。通过 $.atoms 注册标准插件前端配置，其中各项含义是：
- test_custom：标准插件后台定义的 code
- tag_code：参数 code，请保持全局唯一，命名规范为 “系统名_参数名”
- type：前端表单类型，可选 input、textarea、radio、checkbox、select、datetime、datatable、upload、combine 等
- attrs：对应 type 的属性设置，如 name、validation</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/38.png" /></p><h1 id="_1">标准插件测试</h1>
<p>创建流程模板，新增标准插件节点，标准插件类型选择新开发的标准插件，展示的输入参数和前端配置项一致，输出参数和后台 outputs_format 一致，其中执行结果是系统默认，值是 True 或 False，表示节点执行结果是成功还是失败。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/39.png" /></p>
<p>根据上一步创建的流程模板，新建任务执行后查看结果。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/40.png" /></p>
<p>如果标准插件执行出错，请先查看节点执行详情，确定是否是代码逻辑异常。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/标准运维/产品白皮书/assets/41.png" /></p>
<p>接着查看 App 组件类型日志，确定是都是 ESB API 调用异常。</p><h1 id="_1">提交代码</h1>
<p>执行 <code>python manage.py collectstatic –noinput</code>，然后就可以提交代码并打包发布了。</p><h1 id="_1">标准插件开发规范</h1>
<ul>
<li>分组命名规则是 “系统名(系统英文缩写)”，如：“作业平台(JOB)”。</li>
<li>标准插件编码 (code) 使用下划线方式，规则是 “系统名_接口名”，如：job_execute_task。</li>
<li>后台类名使用驼峰式，规则是 “标准插件编码+继承类名”，如：JobExecuteTaskService。</li>
<li>前端 JS 文件目录保持和系统名缩写一致，JS 文件名保持和标准插件编码一致。</li>
<li>参数 tag_code 命名规则是 “系统名_参数名”，这样可以保证全局唯一；长度不要超过 20 个字符。</li>
</ul>
    </body>
    </html>
    